home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / libcs / fwantwrite.c < prev    next >
C/C++ Source or Header  |  1995-06-12  |  5KB  |  146 lines

  1. /*
  2.  * Copyright (c) 1990 Carnegie Mellon University
  3.  * All Rights Reserved.
  4.  * 
  5.  * Permission to use, copy, modify and distribute this software and its
  6.  * documentation is hereby granted, provided that both the copyright
  7.  * notice and this permission notice appear in all copies of the
  8.  * software, derivative works or modified versions, and any portions
  9.  * thereof, and that both notices appear in supporting documentation.
  10.  *
  11.  * THE SOFTWARE IS PROVIDED "AS IS" AND CARNEGIE MELLON UNIVERSITY
  12.  * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
  13.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.  IN NO EVENT
  14.  * SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR ANY SPECIAL, DIRECT,
  15.  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
  16.  * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
  17.  * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
  18.  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  19.  *
  20.  * Users of this software agree to return to Carnegie Mellon any
  21.  * improvements or extensions that they make and grant Carnegie the
  22.  * rights to redistribute these changes.
  23.  *
  24.  * Export of this software is permitted only after complying with the
  25.  * regulations of the U.S. Deptartment of Commerce relating to the
  26.  * Export of Technical Data.
  27.  */
  28. /*  fwantwrite  --  attempt to open file for output
  29.  *
  30.  *  Usage:  f = fwantwrite (path,file,fullname,prompt,warn);
  31.  *    FILE *f;
  32.  *    int warn;
  33.  *    char *path,*file,*fullname,*prompt;
  34.  *
  35.  *  Fwantwrite will attempt to open "file" for output somewhere in
  36.  *  the pathlist "path".  If no such file can be created, the user
  37.  *  is given an oportuity to enter a new file name (after the
  38.  *  prompt is printed).  The new file will then be sought using
  39.  *  the same path.
  40.  *  If the path is the null string, the file will be created with
  41.  *  no prefix to the file name.  If the file name is null, the
  42.  *  user will be prompted for a file name immediately.  The user
  43.  *  can always abort fwantwrite by typing just a carriage return
  44.  *  to the prompt.
  45.  *  Fwantwrite will put the name of the successfully created file
  46.  *  into the "fullname" string (which must therefore be long enough to
  47.  *  hold a complete file name), and return its file pointer;
  48.  *  if no file is created, 0 will be returned.
  49.  *  Fwantwrite examines each entry in the path, to see if the
  50.  *  desired file can be created there.  If "warn" is true, 
  51.  *  fwantwrite will first check to ensure that no such file
  52.  *  already exists (if it does, the user is allowed to keep it).
  53.  *  If no such file exists (or the user wants to delete it), then
  54.  *  fwantwrite attempts to create the file.  If it is unsuccessful,
  55.  *  the next entry in the pathlist is examined in the same way.
  56.  *
  57.  *  HISTORY
  58.  * $Log:    fwantwrite.c,v $
  59.  * Revision 1.2  90/12/11  17:53:31  mja
  60.  *     Add copyright/disclaimer for distribution.
  61.  * 
  62.  * 30-Apr-85  Steven Shafer (sas) at Carnegie-Mellon University
  63.  *    Adapted for 4.2 BSD UNIX:  Changed output messages to stderr.
  64.  *
  65.  * 21-Oct-81  Fil Alleva (faa) at Carnegie-Mellon University
  66.  *    Fixed bug which caused an infinite loop when getstr() got
  67.  *    an EOT error and returned NULL. The error return was ignored
  68.  *    and the value of "answer" was not changed which caused the loop.
  69.  *
  70.  * 28-Aug-80  Mike Accetta (mja) at Carnegie-Mellon University
  71.  *    Fixed bug which used "file" instead of "myfile" in call to
  72.  *    searchp.
  73.  *
  74.  * 20-Nov-79  Steven Shafer (sas) at Carnegie-Mellon University
  75.  *    Created for VAX.
  76.  *
  77.  */
  78.  
  79. #include <stdio.h>
  80.  
  81. int strcmp();
  82. FILE *fopen();
  83. int searchp();
  84. char *getstr();
  85.  
  86. static int warnflag;
  87. static FILE *filptr;
  88.  
  89. static int func (fnam)
  90. char *fnam;
  91. {        /* attempt to create fnam */
  92.     register int goahead;
  93.     register int fildes;
  94.  
  95.     goahead = 1;
  96.     fflush (stdout);
  97.     if (warnflag) {
  98.         fildes = open (fnam,1);
  99.         if (fildes >= 0) {
  100.             close (fildes);
  101.             fprintf (stderr,"%s already exists!  ",fnam);
  102.             goahead = getbool ("Delete old file?",0);
  103.         }
  104.     }
  105.     if (goahead) {
  106.         filptr = fopen (fnam,"w");
  107.         if (filptr == 0) {
  108.             goahead = 0;
  109.         }
  110.     }
  111.     return (!goahead);
  112. }
  113.  
  114. FILE *fwantwrite (path,file,fullname,prompt,warn)
  115. char *path,*file,*fullname,*prompt;
  116. int warn;
  117. {
  118.     register int i;
  119.     char myfile[200], *retval;
  120.  
  121.     if (*file == '\0') {
  122.         getstr (prompt,"no file",myfile);
  123.         if (strcmp(myfile,"no file") == 0)  return (0);
  124.     }
  125.     else strcpy (myfile,file);
  126.  
  127.     warnflag = warn;
  128.     do {
  129.         i = searchp (path,myfile,fullname,func);
  130.         if (i < 0) {
  131.             if (*path && (*myfile != '/')) {
  132.                 fprintf (stderr,"%s in path \"%s\":  Can't create.\n",myfile,path);
  133.             } 
  134.             else {
  135.                 perror (myfile);
  136.             }
  137.             retval = getstr (prompt,"no file",myfile);
  138.             if ((strcmp(myfile,"no file") == 0) || retval == NULL)
  139.                 return (0);
  140.         }
  141.     } 
  142.     while (i < 0);
  143.  
  144.     return (filptr);
  145. }
  146.